# 文件名: iterator_generator_examples.py
# 说明: Python3 迭代器与生成器示例合集

print("\n--- 示例1: 迭代器基础 ---")
# 迭代器对象必须实现 __iter__ 和 __next__ 方法
class CountDown:
    def __init__(self, start):
        self.current = start

    def __iter__(self):  # 返回迭代器对象自身
        return self

    def __next__(self):  # 返回下一个值，无元素时抛出 StopIteration
        if self.current <= 0:
            raise StopIteration
        num = self.current
        self.current -= 1
        return num

# 使用迭代器
counter = CountDown(3)
for num in counter:
    print("倒计时:", num)  # 输出 3, 2, 1


print("\n--- 示例2: 可迭代对象 vs 迭代器 ---")
# 可迭代对象（如列表）不是迭代器，但可通过 iter() 转换
numbers = [1, 2, 3]
iter_obj = iter(numbers)  # 将列表转为迭代器
print("next调用1:", next(iter_obj))  # 1
print("next调用2:", next(iter_obj))  # 2
print("next调用3:", next(iter_obj))  # 3


print("\n--- 示例3: 生成器函数（yield） ---")
def fibonacci_gen(n):
    """生成斐波那契数列前n项"""
    a, b = 0, 1
    count = 0
    while count < n:
        yield a  # 每次 yield 暂停并返回当前值
        a, b = b, a + b
        count += 1

# 使用生成器（惰性计算）
fib = fibonacci_gen(5)
print("生成器输出:", list(fib))  # [0, 1, 1, 2, 3]


print("\n--- 示例4: 生成器表达式 ---")
# 类似列表推导式，但返回生成器对象（节省内存）
squares_gen = (x**2 for x in range(5))
print("生成器元素:", list(squares_gen))  # [0, 1, 4, 9, 16]


print("\n--- 示例5: 无限序列生成器 ---")
def infinite_counter():
    num = 0
    while True:
        yield num
        num += 1

# 有限次调用（避免无限循环）
gen = infinite_counter()
print("无限生成器示例:", [next(gen) for _ in range(5)])  # [0,1,2,3,4]


print("\n--- 示例6: 生成器状态管理 ---")
def number_generator():
    yield 10
    yield 20
    yield 30

gen = number_generator()
print("手动调用1:", next(gen))  # 10
print("手动调用2:", next(gen))  # 20
print("剩余元素:", list(gen))    # [30]


print("\n--- 示例7: 协程与 yield 双向通信 ---")
def coroutine_example():
    print("协程启动")
    while True:
        received = yield  # 接收外部 send() 的值
        print(f"收到: {received}")

coro = coroutine_example()
next(coro)        # 启动协程（执行到第一个 yield）
coro.send("数据1")  # 输出: 收到: 数据1
coro.send("数据2")  # 输出: 收到: 数据2


print("\n--- 关键点总结 ---")
print("1. 迭代器协议: 实现 __iter__ 和 __next__ 方法")
print("2. 生成器本质: 自动实现迭代器协议的快捷方式")
print("3. yield 特性: 暂停函数执行并保留状态")
print("4. 内存优势: 生成器逐个产生数据，适合处理大文件/无限序列")
print("5. 一次消费: 生成器遍历后不可重用（需重新创建）")